package com.linkdood.app.service;

import com.linkdood.app.constants.SynchronizeConstants;
import com.linkdood.app.domain.ThirdParty;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @author cfj
 */
public interface ISynchronize {
    /**
     * 组织机构同步锁
     */
    ReentrantLock SYNC_ORG_LOCK = new ReentrantLock();

    /**
     * 用户同步锁
     */
    ReentrantLock SYNC_USER_LOCK = new ReentrantLock();

    /**
     * 同步全部用户 用户自己实现
     *
     * @param thirdParty 平台信息
     */
    void syncAllUser(ThirdParty thirdParty);

    /**
     * 同步部分用户 用户自己实现
     *
     * @param thirdParty 平台信息
     */
    void syncIncrementUser(ThirdParty thirdParty);

    /**
     * 同步全部组织 用户自己实现
     *
     * @param thirdParty 平台信息
     */
    void syncAllOrg(ThirdParty thirdParty);

    /**
     * 同步部分组织 用户自己实现
     *
     * @param thirdParty 平台信息
     */
    void syncIncrementOrg(ThirdParty thirdParty);

    /**
     * 同步人员
     *
     * @param type       类型
     * @param thirdParty 平台信息
     */
    default void syncUser(int type, ThirdParty thirdParty) {
        SYNC_USER_LOCK.lock();
        try {
            if (type == SynchronizeConstants.SYNC_TYPE_ALL) {
                syncAllUser(thirdParty);
            } else if (type == SynchronizeConstants.SYNC_TYPE_INCREMENT) {
                syncIncrementUser(thirdParty);
            }
        } finally {
            SYNC_USER_LOCK.unlock();
        }
    }

    /**
     * 同步组织
     *
     * @param type       类型
     * @param thirdParty 平台信息
     */
    default void syncOrg(int type, ThirdParty thirdParty) {
        SYNC_ORG_LOCK.lock();
        try {
            if (type == SynchronizeConstants.SYNC_TYPE_ALL) {
                syncAllOrg(thirdParty);
            } else if (type == SynchronizeConstants.SYNC_TYPE_INCREMENT) {
                syncIncrementOrg(thirdParty);
            }
        } finally {
            SYNC_ORG_LOCK.unlock();
        }
    }
}
